package com.wang.rabbitmqstudy.config;

import org.springframework.amqp.core.Queue;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;


/**
 * 队列配置
 */
@Configuration
public class QueueConfig {

    @Autowired
    private PropertiesConfig propertiesConfig;

    @Bean
    Queue redQueue() {
        return new Queue(propertiesConfig.getRedQueue());
    }

    @Bean
    Queue blueQueue() {
        return new Queue(propertiesConfig.getBlueQueue());
    }

    @Bean
    Queue yellowQueue() {
        return new Queue(propertiesConfig.getYellowQueue());
    }

    /**
     * 排他队列，只能被当前连接使用，随连接销毁而删除，就算设置持久化，重启之后也没有了
     */
    @Bean
    Queue exclusiveQueue() {
        return new Queue(propertiesConfig.getArgumentsExclusiveQueue(), true, true, false);
    }

    /**
     * 自动删除队列，至少有1个消费者消费这个队列，当所有消费者都与之断开链接。队列被删除
     */
    @Bean
    Queue autoDeleteQueue() {
        return new Queue(propertiesConfig.getArgumentsAutoDeleteQueue(), true, false, true);
    }

    /**
     * 优先级队列，只有数据堆积的时候才能看出效果
     */
    @Bean
    Queue priorityQueue() {
        // 设置最大优先级
        Map<String, Object> arguments = new HashMap<>();
        arguments.put("x-max-priority", 200);
        Queue queue = new Queue(propertiesConfig.getArgumentsPriorityQueue(), true, false, false, arguments);
        return queue;
    }

    /**
     * ttl队列
     */
    @Bean
    Queue ttlQueue() {
        // 设置ttl
        Map<String, Object> arguments = new HashMap<>();
        arguments.put("x-message-ttl", 60000);
        Queue queue = new Queue(propertiesConfig.getArgumentsTtlQueue(), true, false, false, arguments);
        return queue;
    }

    /**
     * 指定死信交换机的普通队列
     */
    @Bean
    Queue commonQueue() {
        // 指定队列的死信交换机、routing key
        Map<String, Object> headers = new HashMap<>();
        headers.put("x-dead-letter-exchange", "deadLetterExchange");
        headers.put("x-dead-letter-routing-key", "deadLetterRoutingKey");
        return new Queue(propertiesConfig.getArgumentsCommonQueue(), true, false, false, headers);
    }

    /**
     * 死信队列
     */
    @Bean
    Queue deadLetterQueue() {
        return new Queue(propertiesConfig.getDeadLetterQueue(), true, false, false);
    }

    /**
     * 备用队列-普通队列
     */
    @Bean
    Queue backupCommonQueue() {
        return new Queue(propertiesConfig.getBackupCommonQueue(), true, false, false);
    }

    /**
     * 备用队列
     */
    @Bean
    Queue backupQueue() {
        return new Queue(propertiesConfig.getBackupQueue(), true, false, false);
    }
}
